<<<<<<< HEAD ======= >>>>>>> master
#Importing Data Set
ss14pusa = read.csv(file.choose(),header=TRUE)  # read csv file
ss14pusb = read.csv(file.choose(),header=TRUE)

#Libraries
require(plyr)
require(dplyr)
#Importing Data Set in a faster way
library(data.table)
variables=c("SEX","OCCP","WKHP","MAR","WAGP","SCHL","ESP","RAC1P","ST","PAOC","PWGTP")
ss14pusa=fread("~/Google Drive/Data for R/csv_pus/ss14pusa.csv",head=TRUE,select=variables)
ss14pusb=fread("~/Google Drive/Data for R/csv_pus/ss14pusb.csv",head=TRUE,select=variables)
attach(ss14pusa)
names(ss14pusa)
ss14pusa_edit = data.frame(SEX,OCCP,WKHP,MAR,WAGP,SCHL,ESP, RAC1P, ST, PAOC, PWGTP)
detach(ss14pusa)

attach(ss14pusb)
ss14pusb_edit = data.frame(SEX,OCCP,WKHP,MAR,WAGP,SCHL,ESP, RAC1P, ST, PAOC, PWGTP)
detach(ss14pusb)

Data = rbind(ss14pusa_edit,ss14pusb_edit)
colnames(Data) <- c("Gender","Occupation", "Work_hours", "Marriage", "Income", "Education" ,"Parental_Occupation", "Race", "State", "Children", "Weight")


write.csv(Data, file = "Data.csv",row.names=TRUE)
#Delete income=0/NA rows
row_to_keep=which(Data$Income>0)
Data=Data[row_to_keep,]
#Recode Region
#https://en.wikipedia.org/wiki/List_of_regions_of_the_United_States#/media/File:Census_Regions_and_Division_of_the_United_States.svg
require(car)
Data$Region <- recode(Data$State,"c(09,23,25,33,44,59,34,36,42)='Northeast';c(17,18,26,38,55,19,20,27,29,31,38,46,39)='Midwest'; c(10,12,13,24,37,45,51,11,54,01,21,28,47,05,22,40,48)='South';c(04,08,16,30,32,35,49,50,02,06,15,41,53,56)='West';'72'='Puerto Rico'")
# Recode Division
Data$Division <- recode(Data$State,"c(53,41,6,2,15)='Pacific';c(4,8,16,30,32,35,49,56)='Mountain'; c(19,20,27,29,31,38,46)='West North Central';c(17,18,26,39,55)='East North Central';c(5,22,40,48)='West South Central';c(1,21,28,47)='East South Central';c(34,36,42)='Middle Atlantic';c(10,11,12,13,24,37,45,51,54)='South Atlantic';c(9,23,25,33,44,50)='New England'")
#Recode Education
Data$Education <- recode(Data$Education,"c(01,02,03,04,05,06,07,08,09,10,11)='~greade8';c(12,13,14,15,16,17,18,19)='grade9~college_nodegree';c(20,21)='associate/bachelor';c(22,23)='master/professional';c(24)='doctor')
#Recode Education
library(car)
Data$Education <- recode(Data$Education,"1:11='~greade8';12:19='grade9~college_nodegree';20:21='associate/bachelor';22:23='master/professional';24='doctor'")
# On Survey Weights
# http://tophcito.blogspot.co.at/2014/04/social-science-goes-r-weighted-survey.html We assign everyone that did make it into the sample a weight. So people that turn out too often in the sample receive a weight of less than 1. And those that we were not able to reach enough of are upweighted with a weight larger than 1. Respondents that belong to groups that have been sampled perfectly receive a weight of 1. This solution is called post-stratification, because it computes weights based on group (or stratum) characteristics, like the distribution of age or gender proportions.

require(survey)
Data.w = svydesign(ids = ~1, data = Data, weights = Data$Weight)
summary(Data.w)

# comparison of the sex ratios in the unweighted and the weighted data frames:
prop.table(table(Data$Gender))
prop.table(svytable(~Gender, design = Data.w))

# Run this to see how it works
table(Data$Gender)
svytable(~Gender, design = Data.w)

# Take my interested variable 'State' as an example, the difference between the unweighted and weighted ratio is really small
prop.table(table(Data$State)) - prop.table(svytable(~State, design = Data.w))

# Ultimately, the difference for each income level between unweighted and weighted is small too
prop.table(table(Data$Income)) - prop.table(svytable(~Income, design = Data.w))
MotherWorking=select(Data_women, Income,Children,Work_hours)
#detach(package:plyr)
GroupedMotherWorking <-
  MotherWorking %>%
  na.omit() %>%
  group_by(Children,Work_hours) %>% 
  summarize(
    AvgIncome = mean(Income),
    count=n()
  ) 

library(plotly)
# note how size is automatically scaled and added as hover text

plot_ly(GroupedMotherWorking, x = Work_hours, y = AvgIncome,size=sqrt(count), color = Children,text = paste("Count: ", count),opacity=1-Children*0.2,mode = "markers")

#plot_ly(GroupedMotherWorking, x = Work_hours, y = AvgIncome, text = paste("Count: ", #count),mode = "markers", opacity=1-Children*0.2,color = Children)

Observations: 1. When work_hours smaller than 60Hrs, Avg Income tend to be positively related to work hour. 2. There are generally more females with no Children 3. Females with Children from 6 to 17 often has higher avg income

MotherOccupation=select(Data_women, Income,Children,Occupation)
#detach(package:plyr)
GroupedMotherOccupation <-
  MotherOccupation %>%
  na.omit() %>%
  group_by(Children,Occupation) %>% 
  summarize(
    AvgIncome = mean(Income),
    count=n()
  ) 


revalue(GroupedMotherOccupation$Children,c('1'='Children under 6','2'='Children from 6 to 17','3'='Children under 6 and above 6','4'='No Children'))

ggplot(GroupedMotherOccupation,aes(x=Children))+geom_point(aes(y=Occupation,size=count,colour=AvgIncome))+scale_colour_gradient(low="green",high="red")+scale_x_continuous(breaks=1:4, labels=c("Children under 6", "Children from 6 to 17", "Children under 6 and above 6", "No Children")) 

#scale_colour_gradientn(colours = terrain.colors(10))

Observations: 1. Females with Children from 6 to 17 usually tend to have higher average income as the dot has darker color. 2. Occupation of ENG, MGR and CMM usually tend to have higher salary. On the other hand, female in LGL field always have lower salary 3.

<<<<<<< HEAD
# Regional Effect
# wanna know how to use survey weights
# calculate median of women in each State and plot in mapview
# Investigate in Occupation or other vavriables to see why

DW=Data[Data$Gender==2, ]

# boxplot of each state/division/region to see distribution
require(plotly)
plot_ly(DW, x = Income, color = Region, type = "box")
plot_ly(DW, x = Income, color = Division, type = "box")
boxplot(DW$Income~DW$State) 

# calculate median of women in each Division/Region/State
library(dplyr)
DivMedian <- aggregate(Income~Division,Data_women, median)
RegMedian <- aggregate(Income~Region,Data_women, median)
StateMedian <- aggregate(Income~State,DW, median)

# Recode State Names
library(readr)
statenames <- read_csv("~/Google Drive/Columbia/5243 ADS/Project 1/data/statenames.csv")
names(StateMedian)[1]<-"code"
State.Median <- merge(StateMedian, statenames, by="code")
head(SM)

# plot state income median in mapview
require(googleVis)
map<-gvisGeoMap(data=State.Median, locationvar = "name", numvar="Income",options=list(region="US",dataMode="regions",width='800px',heigth='600px',gvis.editor = "Income Median of US States", colors="[0xEFEDF5, 0xA64D79]"))
plot(map)
=======
plot_ly(DW, x = Income, color = Division, type = "box")
n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
>>>>>>> master

From the graphs we see that the Northeast region, especially the New England Division, has higher income level than other parts of the States. The next question is why it happens, e.g. particular popular high-income occupations in certain regions?

LS0tCnRpdGxlOiAiV29tZW4gaW4gV29yayBGb3JjZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9IAojSW1wb3J0aW5nIERhdGEgU2V0CnNzMTRwdXNhID0gcmVhZC5jc3YoZmlsZS5jaG9vc2UoKSxoZWFkZXI9VFJVRSkgICMgcmVhZCBjc3YgZmlsZQpzczE0cHVzYiA9IHJlYWQuY3N2KGZpbGUuY2hvb3NlKCksaGVhZGVyPVRSVUUpCgojTGlicmFyaWVzCnJlcXVpcmUocGx5cikKcmVxdWlyZShkcGx5cikKYGBgCgpgYGB7cn0KI0ltcG9ydGluZyBEYXRhIFNldCBpbiBhIGZhc3RlciB3YXkKbGlicmFyeShkYXRhLnRhYmxlKQp2YXJpYWJsZXM9YygiU0VYIiwiT0NDUCIsIldLSFAiLCJNQVIiLCJXQUdQIiwiU0NITCIsIkVTUCIsIlJBQzFQIiwiU1QiLCJQQU9DIiwiUFdHVFAiKQpzczE0cHVzYT1mcmVhZCgifi9Hb29nbGUgRHJpdmUvRGF0YSBmb3IgUi9jc3ZfcHVzL3NzMTRwdXNhLmNzdiIsaGVhZD1UUlVFLHNlbGVjdD12YXJpYWJsZXMpCnNzMTRwdXNiPWZyZWFkKCJ+L0dvb2dsZSBEcml2ZS9EYXRhIGZvciBSL2Nzdl9wdXMvc3MxNHB1c2IuY3N2IixoZWFkPVRSVUUsc2VsZWN0PXZhcmlhYmxlcykKCmBgYAoKYGBge3J9CmF0dGFjaChzczE0cHVzYSkKbmFtZXMoc3MxNHB1c2EpCnNzMTRwdXNhX2VkaXQgPSBkYXRhLmZyYW1lKFNFWCxPQ0NQLFdLSFAsTUFSLFdBR1AsU0NITCxFU1AsIFJBQzFQLCBTVCwgUEFPQywgUFdHVFApCmRldGFjaChzczE0cHVzYSkKCmF0dGFjaChzczE0cHVzYikKc3MxNHB1c2JfZWRpdCA9IGRhdGEuZnJhbWUoU0VYLE9DQ1AsV0tIUCxNQVIsV0FHUCxTQ0hMLEVTUCwgUkFDMVAsIFNULCBQQU9DLCBQV0dUUCkKZGV0YWNoKHNzMTRwdXNiKQoKRGF0YSA9IHJiaW5kKHNzMTRwdXNhX2VkaXQsc3MxNHB1c2JfZWRpdCkKY29sbmFtZXMoRGF0YSkgPC0gYygiR2VuZGVyIiwiT2NjdXBhdGlvbiIsICJXb3JrX2hvdXJzIiwgIk1hcnJpYWdlIiwgIkluY29tZSIsICJFZHVjYXRpb24iICwiUGFyZW50YWxfT2NjdXBhdGlvbiIsICJSYWNlIiwgIlN0YXRlIiwgIkNoaWxkcmVuIiwgIldlaWdodCIpCgoKd3JpdGUuY3N2KERhdGEsIGZpbGUgPSAiRGF0YS5jc3YiLHJvdy5uYW1lcz1UUlVFKQpgYGAKCmBgYHtyfQojRGVsZXRlIGluY29tZT0wL05BIHJvd3MKcm93X3RvX2tlZXA9d2hpY2goRGF0YSRJbmNvbWU+MCkKRGF0YT1EYXRhW3Jvd190b19rZWVwLF0KYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQojcmVjb2RlIE9DQ1AKY2xhc3MoRGF0YSRPY2N1cGF0aW9uKSA8LSAibnVtZXJpYyIKRGF0YSRPY2N1cGF0aW9uIDwtIGlmZWxzZShEYXRhJE9jY3VwYXRpb24gPj0gMTAgJiBEYXRhJE9jY3VwYXRpb24gPD0gNDMwLCAxLCBEYXRhJE9jY3VwYXRpb24pCkRhdGEkT2NjdXBhdGlvbiA8LSBpZmVsc2UoRGF0YSRPY2N1cGF0aW9uID49IDEwMDUgJiBEYXRhJE9jY3VwYXRpb24gPD0gMTI0MCwgMiwgRGF0YSRPY2N1cGF0aW9uKQpEYXRhJE9jY3VwYXRpb24gPC0gaWZlbHNlKERhdGEkT2NjdXBhdGlvbiA+PSA4MDAgJiBEYXRhJE9jY3VwYXRpb24gPD0gOTUwLCAzLCBEYXRhJE9jY3VwYXRpb24pCkRhdGEkT2NjdXBhdGlvbiA8LSBpZmVsc2UoRGF0YSRPY2N1cGF0aW9uID49IDIxMDUgJiBEYXRhJE9jY3VwYXRpb24gPD0gMjE2MCwgNCwgRGF0YSRPY2N1cGF0aW9uKQpEYXRhJE9jY3VwYXRpb24gPC0gaWZlbHNlKERhdGEkT2NjdXBhdGlvbiA+PSAzMDAwICYgRGF0YSRPY2N1cGF0aW9uIDw9IDM1NDAsIDUsIERhdGEkT2NjdXBhdGlvbikKRGF0YSRPY2N1cGF0aW9uIDwtIGlmZWxzZShEYXRhJE9jY3VwYXRpb24gPj0gNTEwICYgRGF0YSRPY2N1cGF0aW9uIDw9IDc0MCwgNiwgRGF0YSRPY2N1cGF0aW9uKQpEYXRhJE9jY3VwYXRpb24gPC0gaWZlbHNlKERhdGEkT2NjdXBhdGlvbiA+PSAxMzAwICYgRGF0YSRPY2N1cGF0aW9uIDw9IDE1NjAsIDcsIERhdGEkT2NjdXBhdGlvbikKRGF0YSRPY2N1cGF0aW9uIDwtIGlmZWxzZShEYXRhJE9jY3VwYXRpb24gPj0gMTYwMCAmIERhdGEkT2NjdXBhdGlvbiA8PSAxOTY1LCA4LCBEYXRhJE9jY3VwYXRpb24pCgpEYXRhIDwtIGZpbHRlcihEYXRhLCBPY2N1cGF0aW9uICVpbiUgYygxOjgpKQpEYXRhJE9jY3VwYXRpb24gPC0gYXMuZmFjdG9yKERhdGEkT2NjdXBhdGlvbikKCmxldmVscyhEYXRhJE9jY3VwYXRpb24pIDwtIGMoJ01HUicsICdDTU0nLCAnRklOJywgJ0xHTCcsICdNRUQnICwgJ0JVUycsICdFTkcnLCAnU0NJJykKYGBgCgpgYGB7cn0KI1JlY29kZSBSZWdpb24KI2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfcmVnaW9uc19vZl90aGVfVW5pdGVkX1N0YXRlcyMvbWVkaWEvRmlsZTpDZW5zdXNfUmVnaW9uc19hbmRfRGl2aXNpb25fb2ZfdGhlX1VuaXRlZF9TdGF0ZXMuc3ZnCnJlcXVpcmUoY2FyKQpEYXRhJFJlZ2lvbiA8LSByZWNvZGUoRGF0YSRTdGF0ZSwiYygwOSwyMywyNSwzMyw0NCw1OSwzNCwzNiw0Mik9J05vcnRoZWFzdCc7YygxNywxOCwyNiwzOCw1NSwxOSwyMCwyNywyOSwzMSwzOCw0NiwzOSk9J01pZHdlc3QnOyBjKDEwLDEyLDEzLDI0LDM3LDQ1LDUxLDExLDU0LDAxLDIxLDI4LDQ3LDA1LDIyLDQwLDQ4KT0nU291dGgnO2MoMDQsMDgsMTYsMzAsMzIsMzUsNDksNTAsMDIsMDYsMTUsNDEsNTMsNTYpPSdXZXN0JzsnNzInPSdQdWVydG8gUmljbyciKQpgYGAKYGBge3J9CiMgUmVjb2RlIERpdmlzaW9uCkRhdGEkRGl2aXNpb24gPC0gcmVjb2RlKERhdGEkU3RhdGUsImMoNTMsNDEsNiwyLDE1KT0nUGFjaWZpYyc7Yyg0LDgsMTYsMzAsMzIsMzUsNDksNTYpPSdNb3VudGFpbic7IGMoMTksMjAsMjcsMjksMzEsMzgsNDYpPSdXZXN0IE5vcnRoIENlbnRyYWwnO2MoMTcsMTgsMjYsMzksNTUpPSdFYXN0IE5vcnRoIENlbnRyYWwnO2MoNSwyMiw0MCw0OCk9J1dlc3QgU291dGggQ2VudHJhbCc7YygxLDIxLDI4LDQ3KT0nRWFzdCBTb3V0aCBDZW50cmFsJztjKDM0LDM2LDQyKT0nTWlkZGxlIEF0bGFudGljJztjKDEwLDExLDEyLDEzLDI0LDM3LDQ1LDUxLDU0KT0nU291dGggQXRsYW50aWMnO2MoOSwyMywyNSwzMyw0NCw1MCk9J05ldyBFbmdsYW5kJyIpCmBgYAoKYGBge3J9CiNSZWNvZGUgRWR1Y2F0aW9uCkRhdGEkRWR1Y2F0aW9uIDwtIHJlY29kZShEYXRhJEVkdWNhdGlvbiwiYygwMSwwMiwwMywwNCwwNSwwNiwwNywwOCwwOSwxMCwxMSk9J35ncmVhZGU4JztjKDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5KT0nZ3JhZGU5fmNvbGxlZ2Vfbm9kZWdyZWUnO2MoMjAsMjEpPSdhc3NvY2lhdGUvYmFjaGVsb3InO2MoMjIsMjMpPSdtYXN0ZXIvcHJvZmVzc2lvbmFsJztjKDI0KT0nZG9jdG9yJykKCmBgYAoKYGBge3J9CiNSZWNvZGUgRWR1Y2F0aW9uCmxpYnJhcnkoY2FyKQpEYXRhJEVkdWNhdGlvbiA8LSByZWNvZGUoRGF0YSRFZHVjYXRpb24sIjE6MTE9J35ncmVhZGU4JzsxMjoxOT0nZ3JhZGU5fmNvbGxlZ2Vfbm9kZWdyZWUnOzIwOjIxPSdhc3NvY2lhdGUvYmFjaGVsb3InOzIyOjIzPSdtYXN0ZXIvcHJvZmVzc2lvbmFsJzsyND0nZG9jdG9yJyIpCmBgYAoKYGBge3J9CiMgT24gU3VydmV5IFdlaWdodHMKIyBodHRwOi8vdG9waGNpdG8uYmxvZ3Nwb3QuY28uYXQvMjAxNC8wNC9zb2NpYWwtc2NpZW5jZS1nb2VzLXItd2VpZ2h0ZWQtc3VydmV5Lmh0bWwgV2UgYXNzaWduIGV2ZXJ5b25lIHRoYXQgZGlkIG1ha2UgaXQgaW50byB0aGUgc2FtcGxlIGEgd2VpZ2h0LiBTbyBwZW9wbGUgdGhhdCB0dXJuIG91dCB0b28gb2Z0ZW4gaW4gdGhlIHNhbXBsZSByZWNlaXZlIGEgd2VpZ2h0IG9mIGxlc3MgdGhhbiAxLiBBbmQgdGhvc2UgdGhhdCB3ZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWNoIGVub3VnaCBvZiBhcmUgdXB3ZWlnaHRlZCB3aXRoIGEgd2VpZ2h0IGxhcmdlciB0aGFuIDEuIFJlc3BvbmRlbnRzIHRoYXQgYmVsb25nIHRvIGdyb3VwcyB0aGF0IGhhdmUgYmVlbiBzYW1wbGVkIHBlcmZlY3RseSByZWNlaXZlIGEgd2VpZ2h0IG9mIDEuIFRoaXMgc29sdXRpb24gaXMgY2FsbGVkIHBvc3Qtc3RyYXRpZmljYXRpb24sIGJlY2F1c2UgaXQgY29tcHV0ZXMgd2VpZ2h0cyBiYXNlZCBvbiBncm91cCAob3Igc3RyYXR1bSkgY2hhcmFjdGVyaXN0aWNzLCBsaWtlIHRoZSBkaXN0cmlidXRpb24gb2YgYWdlIG9yIGdlbmRlciBwcm9wb3J0aW9ucy4KCnJlcXVpcmUoc3VydmV5KQpEYXRhLncgPSBzdnlkZXNpZ24oaWRzID0gfjEsIGRhdGEgPSBEYXRhLCB3ZWlnaHRzID0gRGF0YSRXZWlnaHQpCnN1bW1hcnkoRGF0YS53KQoKIyBjb21wYXJpc29uIG9mIHRoZSBzZXggcmF0aW9zIGluIHRoZSB1bndlaWdodGVkIGFuZCB0aGUgd2VpZ2h0ZWQgZGF0YSBmcmFtZXM6CnByb3AudGFibGUodGFibGUoRGF0YSRHZW5kZXIpKQpwcm9wLnRhYmxlKHN2eXRhYmxlKH5HZW5kZXIsIGRlc2lnbiA9IERhdGEudykpCgojIFJ1biB0aGlzIHRvIHNlZSBob3cgaXQgd29ya3MKdGFibGUoRGF0YSRHZW5kZXIpCnN2eXRhYmxlKH5HZW5kZXIsIGRlc2lnbiA9IERhdGEudykKCiMgVGFrZSBteSBpbnRlcmVzdGVkIHZhcmlhYmxlICdTdGF0ZScgYXMgYW4gZXhhbXBsZSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW53ZWlnaHRlZCBhbmQgd2VpZ2h0ZWQgcmF0aW8gaXMgcmVhbGx5IHNtYWxsCnByb3AudGFibGUodGFibGUoRGF0YSRTdGF0ZSkpIC0gcHJvcC50YWJsZShzdnl0YWJsZSh+U3RhdGUsIGRlc2lnbiA9IERhdGEudykpCgojIFVsdGltYXRlbHksIHRoZSBkaWZmZXJlbmNlIGZvciBlYWNoIGluY29tZSBsZXZlbCBiZXR3ZWVuIHVud2VpZ2h0ZWQgYW5kIHdlaWdodGVkIGlzIHNtYWxsIHRvbwpwcm9wLnRhYmxlKHRhYmxlKERhdGEkSW5jb21lKSkgLSBwcm9wLnRhYmxlKHN2eXRhYmxlKH5JbmNvbWUsIGRlc2lnbiA9IERhdGEudykpCgpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CiNhZGQgaW4gd2VpZ2h0cy4uLmV4YW1wbGUgY29kZSBmcm9tIHByZXZpb3VzIHByb2plY3Q6CnJlcXVpcmUoc3VydmV5KQoKZGYxPC1zdnJlcGRlc2lnbih2YXJpYWJsZXM9cHVzX25ld1ssMToxM10sIApyZXB3ZWlnaHRzPXB1c19uZXdbLDE0OjkzXSwgdHlwZT0iQlJSIixjb21iaW5lZC53ZWlnaHRzPVRSVUUsCndlaWdodHM9cHVzX25ldyRQV0dUUCkKc3VtbWFyeShkZjEpCnN2eW1lYW4ofiBXQUdQLGRmMSwgbmEucm0gPSBUKQoKI0lmIFdlIG9ubHkgd2FudCB0byBrbm93IHRoZSBTRSBhbmQgTWVhbiBvZiBTdGF0aXN0aWNzIEluY29tZT8KCnB1c19uZXckRk9EMVBbcHVzX25ldyRGT0QxUCA9PSAzNzAyIHwgcHVzX25ldyRGT0QxUCA9PSA2MjEyIHwgcHVzX25ldyRGT0QxUCA9PSA2MjAyXTwtIlN0YXRpc3RpY3MiCmRmPC1zdWJzZXQocHVzX25ldywgcHVzX25ldyRGT0QxUD09IlN0YXRpc3RpY3MiKQpkZjI8LXN2cmVwZGVzaWduKHZhcmlhYmxlcz1kZlssMToxM10sIApyZXB3ZWlnaHRzPWRmWywxNDo5M10sIHR5cGU9IkJSUiIsY29tYmluZWQud2VpZ2h0cz1UUlVFLAp3ZWlnaHRzPWRmJFBXR1RQKQpzdW1tYXJ5KGRmMikKc3Z5bWVhbih+IFdBR1AsZGYyLCBuYS5ybSA9IFQpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KCiNtZWRpYW4gd2FnZSBmb3IgZWFjaCBvY2N1cGF0aW9uIGJ5IGdlbmRlciAoanVzdCB0byBhY2tub3dsZWRnZSB0aGF0IHRoZXJlICppcyogYSBnZW5kZXIgZ2FwKQpyZXF1aXJlKGdncGxvdDIpCkRhdGFfc2V4X29jY3AgPC0gZGRwbHkoRGF0YSwgLihHZW5kZXIsIE9jY3VwYXRpb24pLCBzdW1tYXJpc2UsIE1FQU4gPSB3ZWlnaHRlZC5tZWFuKEluY29tZSwgV2VpZ2h0LCBuYS5ybSA9IFQpKQpnZ3Bsb3QoRGF0YV9zZXhfb2NjcCwgYWVzKHg9T2NjdXBhdGlvbiwgeT1NRUFOLCBmaWxsPWZhY3RvcihHZW5kZXIpKSkgKyAKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIscG9zaXRpb249ImRvZGdlIikgKyAKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJSZFlsR24iKSArCiAgbGFicyhmaWxsPSIiKSArIAogIHlsYWIoIk1lYW4gU2FsYXJ5ICgkKSIpICsgCiAgeGxhYigiT2NjdXBhdGlvbnMiKSArIAogIGdndGl0bGUocGFzdGUoIlNhbGFyeSBDb21wYXJpc29uIGJldHdlZW4gTWVuICYgV29tZW4iKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEpLCAKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnd2hpdGUnICkpICsgCiAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSAxMikKCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KI3N1YnNldCBvbiB3b21lbiwgZXhwbG9yZSBncm91cHMgb2Ygd29tZW4KRGF0YV93b21lbiA8LSBmaWx0ZXIoRGF0YSwgR2VuZGVyID09IDIpCiNSYWNlIC0gQ2F0aGVyaW5lCiNNb3RoZXJob29kIC0gCiNNYXJpdGFsIFN0YXR1cyAtIEVyaWNhIChwb3RlbnRpYWxseSBhZGQgaW4gcmVnaW9uKQojUHJvcG9ydGlvbiBvZiBncmFkdWF0ZSBkZWdyZWVzIGluIGVhY2ggb2NjdXBhdGlvbj8KI1JlZ2lvbiAtIFZpdmllbgoKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpEYXRhX3dvbWVuIDwtIGZpbHRlcihEYXRhLCBHZW5kZXIgPT0gMikKTW90aGVySG9vZD1zZWxlY3QoRGF0YV93b21lbiwgSW5jb21lLENoaWxkcmVuKQojZGV0YWNoKHBhY2thZ2U6cGx5cikKR3JvdXBlZE1vdGhlckhvb2QgPC0KICBNb3RoZXJIb29kICU+JQogIG5hLm9taXQoKSAlPiUKICBncm91cF9ieShDaGlsZHJlbikgJT4lIAogIHN1bW1hcml6ZSgKICAgIEF2Z0luY29tZSA9IG1lYW4oSW5jb21lKQogICkgCgoKIyMjIEJhciBDaGFydApnZ3Bsb3QoR3JvdXBlZE1vdGhlckhvb2QsIGFlcyh4PUNoaWxkcmVuLCB5PUF2Z0luY29tZSkpICsgCiAgZ2VvbV9iYXIoY29sb3VyPSJibGFjayIsIGZpbGw9IiNERDg4ODgiLCB3aWR0aD0uNSwgc3RhdD0iaWRlbnRpdHkiKSArIAogIGd1aWRlcyhmaWxsPUZBTFNFKSArCiAgeGxhYigiQ2hpbGRyZW4iKSArIHlsYWIoIk1lYW4gSW5jb21lIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyg1MDAwMCw3MDAwMCkpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoNDAwMDAsNzAwMDApLG9vYiA9IHJlc2NhbGVfbm9uZSkgKwogIGdndGl0bGUoIkluY29tZSBmb3IgTW90aGVyaG9vZCIpCgoKCiMjIyAKYGBgCgpgYGB7cn0KTW90aGVyV29ya2luZz1zZWxlY3QoRGF0YV93b21lbiwgSW5jb21lLENoaWxkcmVuLFdvcmtfaG91cnMpCiNkZXRhY2gocGFja2FnZTpwbHlyKQpHcm91cGVkTW90aGVyV29ya2luZyA8LQogIE1vdGhlcldvcmtpbmcgJT4lCiAgbmEub21pdCgpICU+JQogIGdyb3VwX2J5KENoaWxkcmVuLFdvcmtfaG91cnMpICU+JSAKICBzdW1tYXJpemUoCiAgICBBdmdJbmNvbWUgPSBtZWFuKEluY29tZSksCiAgICBjb3VudD1uKCkKICApIAoKbGlicmFyeShwbG90bHkpCiMgbm90ZSBob3cgc2l6ZSBpcyBhdXRvbWF0aWNhbGx5IHNjYWxlZCBhbmQgYWRkZWQgYXMgaG92ZXIgdGV4dAoKcGxvdF9seShHcm91cGVkTW90aGVyV29ya2luZywgeCA9IFdvcmtfaG91cnMsIHkgPSBBdmdJbmNvbWUsc2l6ZT1zcXJ0KGNvdW50KSwgY29sb3IgPSBDaGlsZHJlbix0ZXh0ID0gcGFzdGUoIkNvdW50OiAiLCBjb3VudCksb3BhY2l0eT0xLUNoaWxkcmVuKjAuMixtb2RlID0gIm1hcmtlcnMiKQoKI3Bsb3RfbHkoR3JvdXBlZE1vdGhlcldvcmtpbmcsIHggPSBXb3JrX2hvdXJzLCB5ID0gQXZnSW5jb21lLCB0ZXh0ID0gcGFzdGUoIkNvdW50OiAiLCAjY291bnQpLG1vZGUgPSAibWFya2VycyIsIG9wYWNpdHk9MS1DaGlsZHJlbiowLjIsY29sb3IgPSBDaGlsZHJlbikKYGBgCk9ic2VydmF0aW9uczoKMS4gV2hlbiB3b3JrX2hvdXJzIHNtYWxsZXIgdGhhbiA2MEhycywgQXZnIEluY29tZSB0ZW5kIHRvIGJlIHBvc2l0aXZlbHkgcmVsYXRlZCB0byB3b3JrIGhvdXIuCjIuIFRoZXJlIGFyZSBnZW5lcmFsbHkgbW9yZSBmZW1hbGVzIHdpdGggbm8gQ2hpbGRyZW4KMy4gRmVtYWxlcyB3aXRoIENoaWxkcmVuIGZyb20gNiB0byAxNyBvZnRlbiBoYXMgaGlnaGVyIGF2ZyBpbmNvbWUKYGBge3J9Ck1vdGhlck9jY3VwYXRpb249c2VsZWN0KERhdGFfd29tZW4sIEluY29tZSxDaGlsZHJlbixPY2N1cGF0aW9uKQojZGV0YWNoKHBhY2thZ2U6cGx5cikKR3JvdXBlZE1vdGhlck9jY3VwYXRpb24gPC0KICBNb3RoZXJPY2N1cGF0aW9uICU+JQogIG5hLm9taXQoKSAlPiUKICBncm91cF9ieShDaGlsZHJlbixPY2N1cGF0aW9uKSAlPiUgCiAgc3VtbWFyaXplKAogICAgQXZnSW5jb21lID0gbWVhbihJbmNvbWUpLAogICAgY291bnQ9bigpCiAgKSAKCgpyZXZhbHVlKEdyb3VwZWRNb3RoZXJPY2N1cGF0aW9uJENoaWxkcmVuLGMoJzEnPSdDaGlsZHJlbiB1bmRlciA2JywnMic9J0NoaWxkcmVuIGZyb20gNiB0byAxNycsJzMnPSdDaGlsZHJlbiB1bmRlciA2IGFuZCBhYm92ZSA2JywnNCc9J05vIENoaWxkcmVuJykpCgpnZ3Bsb3QoR3JvdXBlZE1vdGhlck9jY3VwYXRpb24sYWVzKHg9Q2hpbGRyZW4pKStnZW9tX3BvaW50KGFlcyh5PU9jY3VwYXRpb24sc2l6ZT1jb3VudCxjb2xvdXI9QXZnSW5jb21lKSkrc2NhbGVfY29sb3VyX2dyYWRpZW50KGxvdz0iZ3JlZW4iLGhpZ2g9InJlZCIpK3NjYWxlX3hfY29udGludW91cyhicmVha3M9MTo0LCBsYWJlbHM9YygiQ2hpbGRyZW4gdW5kZXIgNiIsICJDaGlsZHJlbiBmcm9tIDYgdG8gMTciLCAiQ2hpbGRyZW4gdW5kZXIgNiBhbmQgYWJvdmUgNiIsICJObyBDaGlsZHJlbiIpKSAKCiNzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGNvbG91cnMgPSB0ZXJyYWluLmNvbG9ycygxMCkpCmBgYApPYnNlcnZhdGlvbnM6CjEuIEZlbWFsZXMgd2l0aCBDaGlsZHJlbiBmcm9tIDYgdG8gMTcgdXN1YWxseSB0ZW5kIHRvIGhhdmUgaGlnaGVyIGF2ZXJhZ2UgaW5jb21lIGFzIHRoZSBkb3QgaGFzIGRhcmtlciBjb2xvci4KMi4gT2NjdXBhdGlvbiBvZiBFTkcsIE1HUiBhbmQgQ01NIHVzdWFsbHkgdGVuZCB0byBoYXZlIGhpZ2hlciBzYWxhcnkuIE9uIHRoZSBvdGhlciBoYW5kLCBmZW1hbGUgaW4gTEdMIGZpZWxkIGFsd2F5cyBoYXZlIGxvd2VyIHNhbGFyeQozLiAKCmBgYHtyfQojIFJlZ2lvbmFsIEVmZmVjdAojIHdhbm5hIGtub3cgaG93IHRvIHVzZSBzdXJ2ZXkgd2VpZ2h0cwojIGNhbGN1bGF0ZSBtZWRpYW4gb2Ygd29tZW4gaW4gZWFjaCBTdGF0ZSBhbmQgcGxvdCBpbiBtYXB2aWV3CiMgSW52ZXN0aWdhdGUgaW4gT2NjdXBhdGlvbiBvciBvdGhlciB2YXZyaWFibGVzIHRvIHNlZSB3aHkKCkRXPURhdGFbRGF0YSRHZW5kZXI9PTIsIF0KCiMgYm94cGxvdCBvZiBlYWNoIHN0YXRlL2RpdmlzaW9uL3JlZ2lvbiB0byBzZWUgZGlzdHJpYnV0aW9uCnJlcXVpcmUocGxvdGx5KQpwbG90X2x5KERXLCB4ID0gSW5jb21lLCBjb2xvciA9IFJlZ2lvbiwgdHlwZSA9ICJib3giKQpwbG90X2x5KERXLCB4ID0gSW5jb21lLCBjb2xvciA9IERpdmlzaW9uLCB0eXBlID0gImJveCIpCmJveHBsb3QoRFckSW5jb21lfkRXJFN0YXRlKSAKCiMgY2FsY3VsYXRlIG1lZGlhbiBvZiB3b21lbiBpbiBlYWNoIERpdmlzaW9uL1JlZ2lvbi9TdGF0ZQpsaWJyYXJ5KGRwbHlyKQpEaXZNZWRpYW4gPC0gYWdncmVnYXRlKEluY29tZX5EaXZpc2lvbixEYXRhX3dvbWVuLCBtZWRpYW4pClJlZ01lZGlhbiA8LSBhZ2dyZWdhdGUoSW5jb21lflJlZ2lvbixEYXRhX3dvbWVuLCBtZWRpYW4pClN0YXRlTWVkaWFuIDwtIGFnZ3JlZ2F0ZShJbmNvbWV+U3RhdGUsRFcsIG1lZGlhbikKCiMgUmVjb2RlIFN0YXRlIE5hbWVzCmxpYnJhcnkocmVhZHIpCnN0YXRlbmFtZXMgPC0gcmVhZF9jc3YoIn4vR29vZ2xlIERyaXZlL0NvbHVtYmlhLzUyNDMgQURTL1Byb2plY3QgMS9kYXRhL3N0YXRlbmFtZXMuY3N2IikKbmFtZXMoU3RhdGVNZWRpYW4pWzFdPC0iY29kZSIKU3RhdGUuTWVkaWFuIDwtIG1lcmdlKFN0YXRlTWVkaWFuLCBzdGF0ZW5hbWVzLCBieT0iY29kZSIpCmhlYWQoU00pCgojIHBsb3Qgc3RhdGUgaW5jb21lIG1lZGlhbiBpbiBtYXB2aWV3CnJlcXVpcmUoZ29vZ2xlVmlzKQptYXA8LWd2aXNHZW9NYXAoZGF0YT1TdGF0ZS5NZWRpYW4sIGxvY2F0aW9udmFyID0gIm5hbWUiLCBudW12YXI9IkluY29tZSIsb3B0aW9ucz1saXN0KHJlZ2lvbj0iVVMiLGRhdGFNb2RlPSJyZWdpb25zIix3aWR0aD0nODAwcHgnLGhlaWd0aD0nNjAwcHgnLGd2aXMuZWRpdG9yID0gIkluY29tZSBNZWRpYW4gb2YgVVMgU3RhdGVzIiwgY29sb3JzPSJbMHhFRkVERjUsIDB4QTY0RDc5XSIpKQpwbG90KG1hcCkKCgpgYGAKRnJvbSB0aGUgZ3JhcGhzIHdlIHNlZSB0aGF0IHRoZSBOb3J0aGVhc3QgcmVnaW9uLCBlc3BlY2lhbGx5IHRoZSBOZXcgRW5nbGFuZCBEaXZpc2lvbiwgaGFzIGhpZ2hlciBpbmNvbWUgbGV2ZWwgdGhhbiBvdGhlciBwYXJ0cyBvZiB0aGUgU3RhdGVzLiBUaGUgbmV4dCBxdWVzdGlvbiBpcyB3aHkgaXQgaGFwcGVucywgZS5nLiBwYXJ0aWN1bGFyIHBvcHVsYXIgaGlnaC1pbmNvbWUgb2NjdXBhdGlvbnMgaW4gY2VydGFpbiByZWdpb25zPwoKCg==